package com.such.kit.resource.support;

import java.text.MessageFormat;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import com.such.kit.resource.ReadProperties;
import com.such.kit.resource.ReadResourceBundle;
import com.such.kit.validate.ValidateCommons;

/**
 * @author SUCH
 * <pre>
 * properties 资源文件操作超类
 * </pre>
 */
public abstract class ReadResource {

	/**
	 * <pre>
	 * 获取资源名
	 * 
	 * 根据实现的不同，可能是绝对路径、相对路径、类名(xxx.xxx.propertiesName)
	 * </pre>
	 * @return 资源名
	 */
	public abstract String getResourceName();

	/**
	 * <pre>
	 * 获取资源文件中所有的键
	 * </pre>
	 * @return 键集
	 */
	public abstract List<String> getKeys();

	/**
	 * <pre>
	 * 获取指定的键值
	 * </pre>
	 * @param key 键
	 * @return 键值
	 */
	public abstract String getValue(String key);

	/**
	 * <pre>
	 * 获取所有键值对
	 * </pre>
	 * @return 键值对集
	 */
	public abstract Map<String, String> getValues();

	/**
	 * <pre>
	 * 获取资源文件中所有的键
	 * 
	 * 使用 {@link ReadProperties#ReadProperties(String, boolean)} 实现
	 * relatively 默认为 true
	 * </pre>
	 * @param resourceName 资源名
	 * @return 键集
	 */
	public static List<String> getKeys(String resourceName) {
		return getReadResource(resourceName, null).getKeys();
	}

	/**
	 * <pre>
	 * 获取资源文件中所有的键
	 * 
	 * 使用 {@link ReadResourceBundle#ReadResourceBundle(String, Locale)} 实现
	 * </pre>
	 * @param resourceName 资源名
	 * @param locale 语言
	 * @return 键集
	 */
	public static List<String> getKeys(String resourceName, Locale locale) {
		return getReadResource(resourceName, locale).getKeys();
	}

	/**
	 * <pre>
	 * 获取指定的键值
	 * 
	 * 使用 {@link ReadProperties#ReadProperties(String, boolean)} 实现
	 * relatively 默认为 true
	 * </pre>
	 * @param resourceName 资源名
	 * @param key 键
	 * @return 键值
	 */
	public static String getValue(String resourceName, String key) {
		return getReadResource(resourceName, null).getValue(key);
	}

	/**
	 * <pre>
	 * 获取指定的键值
	 * 
	 * 使用 {@link ReadResourceBundle#ReadResourceBundle(String, Locale)} 实现
	 * </pre>
	 * @param resourceName 资源名
	 * @param locale 语言
	 * @param key 键
	 * @return 键值
	 */
	public static String getValue(String resourceName, Locale locale, String key) {
		return getReadResource(resourceName, locale).getValue(key);
	}

	/**
	 * <pre>
	 * 获取所有键值对
	 * 
	 * 使用 {@link ReadProperties#ReadProperties(String, boolean)} 实现
	 * relatively 默认为 true
	 * </pre>
	 * @param resourceName 资源名
	 * @return 键值对集
	 */
	public static Map<String, String> getValues(String resourceName) {
		return getReadResource(resourceName, null).getValues();
	}

	/**
	 * <pre>
	 * 获取所有键值对
	 * 
	 * 使用 {@link ReadResourceBundle#ReadResourceBundle(String, Locale)} 实现
	 * </pre>
	 * @param resourceName 资源名
	 * @param locale 语言
	 * @return 键值对集
	 */
	public static Map<String, String> getValues(String resourceName, Locale locale) {
		return getReadResource(resourceName, locale).getValues();
	}

	/**
	 * <pre>
	 * 键值格式化
	 * 使用标准的 properties 标准格式化键值
	 * 
	 * [举例] xxx {0} xxx {1} xxx
	 * </pre>
	 * @param value 键值
	 * @param args 参数集
	 * @return 格式化后的键值
	 */
	public static String formatValue(String value, Object[] args) {
		if (ValidateCommons.isNotEmpty(value)) {
			MessageFormat messageFormat = new MessageFormat(value);
			value = messageFormat.format(args);
		}
		return value;
	}

	private static ReadResource getReadResource(String resourceName, Locale locale) {
		ReadResource readResource = null;
		if (ValidateCommons.isEmpty(locale)) {
			readResource = new ReadProperties(resourceName, true);
		} else {
			readResource = new ReadResourceBundle(resourceName, locale);
		}
		return readResource;
	}

}
